
/*
auto_ptr  
// N4190 Removing auto_ptr, random_shuffle(), And Old <functional> Stuff
    生命周期结束时，销毁指向的内存空间
    不能指向堆数组，只能指向堆对象（变量）
    一片堆空间只属于一个指针指针对象
    多个智能指针对象不能指向同一片堆空间

shared_ptr

    带有引用计数机制，支持多个指针对象指向同一片内存

weak_ptr

    配合shared_ptrer 而引入的一种智能指针。
    弱引用指针 std::weak_ptr 不会引起计数增加。
    std::weak_ptr 没有 * 运算符和 -> 运算符，
    所以不能够对资源进行操作，它的唯一作用就是检查 std::shared_ptr 是否存在， expired() 在资源未被释放时，会返回 true，否则返回 false。

unique_ptr

    一个智能指针对象指向一片内存空间，不能拷贝构造和赋值

*/
#include <iostream>
#include <string>
#include <regex>

#include <memory>
using namespace std;

namespace PtrDemo {
    /*
    [\s\S]*
    \s 是空格 , 官方解释: __匹配任何空白字符，包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
    \S非空格之外的所有字符 , 官方解释: __ 匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
    [\s\S] 就是一个字符匹配以上两种情况, 就是什么都匹配..
    [\s\S]* 是匹配0到n次的意思在加?号是非贪婪匹配
    [\s\S]*?非贪婪匹配
    <!-- [\s\S]*? -->  非贪婪匹配所有的注释
    */
    void regexDemo()
    {
        string files[] = { "foo.txt", "bar.txt", "test", "a0.txt", "AAA.txt" };
        //生成正则对象
        regex txt_regex("[a-z]+\\.txt");
        //仅查询
        for (const auto& file : files)
        {
            cout << file << ": " << regex_match(file, txt_regex) << endl;
        }

        smatch matches;
        for (const auto& file : files)
        {
            if (regex_match(file, matches, txt_regex))
            {
                //smatch第一个元素为整个字符串
                cout << "whole string: " << matches[0].str() << endl;
                cout << "match: " << matches[1].str() << endl;
            }
        }
    }
    class Test
    {
        string m_name;
    public:
        Test(const char* name)
        {
            cout << "Hello, " << name << "." << endl;

            m_name = name;
        }

        void print()
        {
            cout << "I'm " << m_name << "." << endl;
        }

        ~Test()
        {
            cout << "Goodbye, " << m_name << "." << endl;
        }
    };

    int main()
    {
       
        {
        std::shared_ptr<int> share_ptr = std::make_shared<int>(10); //创建int指针，指向10常量
        std::cout << *share_ptr << std::endl;

        (*share_ptr)++;
        std::cout << *share_ptr << std::endl;

        auto p2 = share_ptr; //计数加一
        auto p3 = share_ptr; //计数加一
        auto p4 = share_ptr.get(); //get用于获取原始指针，计数不变
        std::cout << share_ptr.use_count() << std::endl;

        p2.reset(); //reset用于减少一个计数，同时p2不可用
        std::cout << share_ptr.use_count() << std::endl;
        std::cout << (p2 == nullptr) << std::endl;
        //离开作用域，指针自动释放
        }

        {
        shared_ptr<Test> pt(new Test("D.T.Software"));

        cout << "pt = " << pt.get() << endl;

        pt->print();

        cout << endl;

        shared_ptr<Test> pt1(pt);

        cout << "pt = " << pt.get() << endl;
        cout << "pt1 = " << pt1.get() << endl;

        pt1->print();
        }

        {
        std::unique_ptr <int > pointer = std::make_unique <int >(10); // make_unique 从 C++14 引 入
        //std::unique_ptr <int > pointer2 = pointer; // 非 法

        unique_ptr<Test> ptrTestUnique(new Test("D.T.Software"));
        cout << "ptrTestUnique = " << ptrTestUnique.get() << endl;
        ptrTestUnique->print();
        cout << endl;
        }

        return 0;
    }
   
}